package org.zxy.base.util;

import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

/**
 * 自己码对象工具类
 */
public class ClassUtils {
    /**
     * 获取一个包下面的所有类全限定名
     *
     * @param names
     * @param packageNames 包
     * @return
     */
    public static List<Class> getAllClassName( String packageNames){ //packageNames 传入各个controller包
        String[] split = packageNames.split(","); //分割出各个controller包的全限定名
        List<Class> result = new ArrayList<>(); //创建一个字节码对象的集合
        for (String packageName : split) {  //一个packageName就是一个controller包的全限定名
            // 包相对路径
            String packagePath = packageName.replace(".","/"); //把包路径中的点替换为目录
            // 资源URL
            URL url = ClassLoader.getSystemResource(""); //获取classapth  获取项目的根路径，即../target/classes
            File[] files = new File(url.getPath() + packagePath) //获取classapth+packagePath,就是完整的路径
                    .listFiles(file -> file.getName().endsWith(".class")); //链式编程，获取包下各个controller类的.class文件
            if(files == null || files.length < 1){
                continue;
            }
            for(File file : files){
                // 输出类名称
                String fileName = file.getName();  //获取文件名，及xxxController
                fileName = fileName.substring(0,fileName.lastIndexOf(".")); //去掉.class,只留下纯文件名
                //全限定类名
                String allName = packageName+"."+fileName;  //拼接controller类的全限定类名
                try {
                    result.add(Class.forName(allName)); //获取各个controller类的字节码对象，装入result
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }
        }
        return result;
    }
}